package com.tth.learn.addproperties.java;

import org.junit.Test;

import java.net.URL;
import java.util.*;
import java.util.function.Consumer;
import java.util.function.Supplier;

/**
 * Java10新特性
 * @Author tth
 * @Date 2023/1/5 17:30
 */
public class Java10Test {
    /**
     * 新特性一：局部变量的类型推断
     */
    @Test
    public void test1() {
        // 1.声明操作：声明变量时，根据所附的值，推断变量的类型
        // 类型为int
        var num = 10;
        // 类型为ArrayList<String>
        var list = new ArrayList<String>();
        list.add("hello");

        // 2.遍历操作
        for(var i : list) {
            System.out.println(i);
        }

        // 3.普通的遍历操作
        for (var i = 0; i < 10; i++) {
            System.out.println(i);
        }
    }

    /**
     * 局部变量的类型推断--不适用场景
     */
    @Test
    public void test2() {
        // 1.没有初始化的局部变量，不能声明为var
//        var num; // 编译报错

        // 2.Lambda表达式中，左边的函数式接口不能声明为var
        Supplier<Double> sup = () -> Math.random(); // 正确
//        var sup1 = () -> Math.random(); // 编译报错

        // 3.方法引用中，左边函数式接口不能声明为var
        Consumer<String> con = System.out :: println; // 正确
//        var con1 = System.out :: println; // 编译报错

        // 4.数组的静态初始化中，当省略右侧数组元素类型时，左侧变量类型不能生命为var
        int[] arr = {1,2,3,4}; // 正确
//        var arr1 = {1,2,3,4}; // 编译报错

        // 6.catch块中，异常类型不能声明为var
//        try {
//
//        } catch (var e) { // 编译报错
//
//        }
    }

    /**
     * 局部变量的类型推断--不适用场景：方法的返回值类型，不能声明为var
     * @return
     */
//    public var method1() {
//        return 0;
//    }

    /**
     * 局部变量的类型推断--不适用场景：方法的参数类型，不能声明为var
     * @param i
     */
//    public void method2(var i) {
//        System.out.println(i);
//    }

    /**
     * 局部变量的类型推断--不适用场景：构造器的参数类型，不能声明为var
     * @param i
     */
//    public Java10Test(var i) {
//
//    }

    /**
     * 局部变量的类型推断--不适用场景：属性不能声明为var
     * @param i
     */
//    var num = 10;

//    =====================================================================================================================================

    /**
     * 新特性二：集合中新增copyOf，将一个集合转换为只读集合
     */
    @Test
    public void test3() {
        ArrayList<String> list = new ArrayList<>();
        list.add("木兰花令");
        List<String> list1 = List.copyOf(list); // list1为只读集合
    }

    @Test
    public void test4() {
        var list1 = Arrays.asList("浪淘沙令", "木兰花令");
        var copy1 = List.copyOf(list1);
        System.out.println(list1 == copy1); // false

        List<String> list2 = new ArrayList<>();
        list2.add("浪淘沙令");
        list2.add("木兰花令");
        list2 = Collections.unmodifiableList(list2);
        var copy2 = List.copyOf(list2);
        System.out.println(list2 == copy2); // false

        var list3 = List.of("浪淘沙令", "木兰花令");
        var copy3 = List.copyOf(list3);
        System.out.println(list3 == copy3); // true

    }
}
